<!-- Copyright (C) 2019-2021 Junruoyu Zheng. Home page: https://junruoyu-zheng.gitee.io/ligral

     Distributed under MIT license.
     See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
-->
<!DOCTYPE html>
<html lang="en">
 <head>
  <title>
   声明常量
  </title>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>
  <!-- Main CSS -->
  <link href="/ligral/css/style.css" rel="stylesheet"/>
  <link href="/ligral/css/rolling.css" rel="stylesheet"/>
  <link href="/ligral/css/custom.css" rel="stylesheet"/>
  <link href="/ligral/css/katex.min.css" rel="stylesheet"/>
  <link href="/ligral/avatar.png" rel="shortcut icon" type="image/x-icon"/>
  <!-- Font Awesome -->
  <script crossorigin="anonymous" src="https://kit.fontawesome.com/14294c79e2.js">
  </script>
 </head>
 <body>
  <!-- Header -->
  <div class="header-wrap d-none d-md-block">
   <div class="container">
    <div class="row">
     <!-- Left header box -->
     <header class="col-6 text-left">
      <h1 class="letter-wrap title">
       Ligral
      </h1>
     </header>
    </div>
   </div>
  </div>
  <!-- Main navigation -->
  <nav class="navbar navbar-expand-md navbar-dark bg-primary">
   <div class="container">
    <!-- Company name shown on mobile -->
    <a class="navbar-brand d-md-none d-lg-none d-xl-none" href="#">
     Ligral
    </a>
    <!-- Mobile menu toggle -->
    <button aria-controls="mainNavbar" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-target="#mainNavbar" data-toggle="collapse" type="button">
     <span class="navbar-toggler-icon">
     </span>
    </button>
    <!-- Main navigation items -->
    <div class="collapse navbar-collapse" id="mainNavbar">
     <ul class="navbar-nav mr-auto">
      <li class="nav-item">
       <a class="nav-link" href="/ligral/index.html">
        主页
        <span class="sr-only">
         (current)
        </span>
       </a>
      </li>
      <li class="nav-item dropdown active">
       <a aria-expanded="false" aria-haspopup="true" class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button">
        文档
       </a>
       <div class="dropdown-menu navbar-dark bg-primary">
        <a class="dropdown-item" href="/ligral/quick-start.html">
         快速开始
        </a>
        <a class="dropdown-item" href="/ligral/user-guide">
         用户文档
        </a>
        <a class="dropdown-item" href="/ligral/dev-guide">
         开发文档
        </a>
        <a class="dropdown-item" href="/ligral/interface/">
         接口定义
        </a>
       </div>
      </li>
      <!-- <li class="nav-item">
                                <a class="nav-link" href="#">Services</a>
                        </li> -->
      <li class="nav-item">
       <a class="nav-link" href="/ligral/product.html">
        产品
       </a>
      </li>
      <li class="nav-item">
       <a class="nav-link" href="/ligral/contact.html">
        联系我们
       </a>
      </li>
     </ul>
     <!-- <form class="form-inline header-search-form my-2 my-lg-0">
                        <input class="form-control mr-sm-2" type="text" size="10"  placeholder="Search" aria-label="Search">
                        <button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
                    </form> -->
    </div>
   </div>
  </nav>
  <!-- Jumbtron / Slider -->
  <!-- Main content area -->
  <main class="container">
   <div class="row" style="flex-direction: row-reverse;">
    <!-- Main content -->
    <div class="col-sm-8">
     <article>
      <h1>
       声明常量
      </h1>
      <p>
       仿真过程中通常会用到许多全局常量。如果您是 Simulink 用户，您可能用 MATLAB 定义过许多常量，然后在 Simulink 中通过
       <code>
        Constant
       </code>
       模块来调用。全局常量的引入使得模型更加健壮和一致，更方便调整参数，因此是很有必要的。
      </p>
      <h3>
       声明一个标量
      </h3>
      <p>
       声明语句很简单，它总是以
       <code>
        let
       </code>
       关键字起头，然后是常量名、等于号和常量值，并且别忘了要用分号结尾。如下所示：
      </p>
      <pre><code>let a = 1;
</code></pre>
      <p>
       这个语句声明了一个值为 1 的常量
       <code>
        a
       </code>
       。如果您熟悉 JavaScript 的语法，您会发现语法上是非常相似的。但是在 ligral 中您仅能声明一个常量，不可以再对它赋值。
      </p>
      <pre><code>let a = 1;
a = 2;
~~~~~~~~~~~~
Invalid Syntax at line 2 column 4 (=)
</code></pre>
      <p>
       如果您使用的是 v0.1.0 这一版本，您需要替换关键字
       <code>
        let
       </code>
       为
       <code>
        digit
       </code>
       ，并且把等于号改成
       <code>
        &lt;-
       </code>
       符号。这是因为该版本仅支持标量。这些符号在 v0.2.* 版本中也会得到支持，但是预计在 v0.3.0 以上版本中废弃。
      </p>
      <h3>
       声明一个矩阵
      </h3>
      <p>
       在 ligral 中，从版本 v0.2.0 开始，数值类型有标量和二维矩阵两种（目前标量和
       <span class="katex">
        <span class="katex-mathml">
         <math xmlns="http://www.w3.org/1998/Math/MathML">
          <semantics>
           <mrow>
            <mn>
             1
            </mn>
            <mo>
             ×
            </mo>
            <mn>
             1
            </mn>
           </mrow>
           <annotation encoding="application/x-tex">
            1\times 1
           </annotation>
          </semantics>
         </math>
        </span>
        <span aria-hidden="true" class="katex-html">
         <span class="base">
          <span class="strut" style="height:0.72777em;vertical-align:-0.08333em;">
          </span>
          <span class="mord">
           1
          </span>
          <span class="mspace" style="margin-right:0.2222222222222222em;">
          </span>
          <span class="mbin">
           ×
          </span>
          <span class="mspace" style="margin-right:0.2222222222222222em;">
          </span>
         </span>
         <span class="base">
          <span class="strut" style="height:0.64444em;vertical-align:0em;">
          </span>
          <span class="mord">
           1
          </span>
         </span>
        </span>
       </span>
       的矩阵不同，未来可能会统一，但是不影响本节内容），没有向量这一类型，因为向量被当作其中一个维度长度为 1 的矩阵。
      </p>
      <p>
       在声明矩阵时，应将矩阵的内容包含在一对方括号中，用
       <code>
        ;
       </code>
       符号分割每一行，用
       <code>
        ,
       </code>
       符号分割每一行中的每一项。例如：
      </p>
      <pre><code>let A = [1, 0; 0, 1];
</code></pre>
      <p>
       矩阵中的项可以是数字，也可以是矩阵，但是要注意维度的一致性。例如在控制系统中，您可能经常需要扩张 A 矩阵，您可以这么写：
      </p>
      <pre><code>let A0 = [1, 1; 0, 1];
let A = [A0, [0; 1]; 0, -1, 0];
A -&gt; Print;
~~~~~~~~~~~~~~~~~~~~~~~~~~
Time: 0.00       Print1 = (3x3)  1 1 0 0 1 1 0 -1 0
</code></pre>
      <p>
       上面第四行是一个连接语句，目的是把矩阵打印出来，具体见链接语句文档。
      </p>
      <p>
       如果您是 MATLAB 用户，您可能对这个语法非常熟悉，但是有一点要注意的是，MATLAB 允许用空格分割行内的项，在 ligral 中是不允许的，因为这常常引起歧义。您可以试试在 MATLAB 中分别运行以下语句，就能明白用空格来分割是多么不明智的选择：
      </p>
      <pre><code>[1 -1], [1 - 1], [1-1], [1- 1]
[1 *1], [1 * 1], [1*1], [1* 1]
~~~~~~~~~~~~~~~~~~~~~~~~
[1 -1] 0 0 0
1 1 1 1
</code></pre>
      <p>
       除了您会产生误解之外，这种做法对语法解析也会带来负担，因此我们抛弃了这种写法。
      </p>
      <h3>
       从表达式声明常量
      </h3>
      <p>
       除了直接给常量赋值意外，您还可以进行一些简单的表达式计算。目前支持的操作符有
       <code>
        +
       </code>
       、
       <code>
        -
       </code>
       、
       <code>
        *
       </code>
       、
       <code>
        /
       </code>
       和
       <code>
        ^
       </code>
       ，其中
       <code>
        ^
       </code>
       和 MATLAB 一致，表示次方运算。
      </p>
      <p>
       运算的优先级为先计算次方，再运算乘和除，最后运算加减，运算的方向为左结合。如果有圆括号，优先计算括号内部的表达式。
      </p>
      <pre><code>let a = 1 + 2 * 3 ^ (4 - 3);  # 7
</code></pre>
      <p>
       在矩阵的声明中也可以使用表达式，表达式既可以出现在每一项中，也可以是矩阵的运算（
       <em>
        目前矩阵的次方虽然语法上支持，但是功能上还没有完全实现
       </em>
       ）。
      </p>
      <pre><code>let A = [1+1; 0] + [1; -1];  # [3, -1]
</code></pre>
      <h3>
       如果要声明一个变量 ...
      </h3>
      <p>
       如果您想要的是随着仿真时长改变的量（或者如果您熟悉 Similink 的话，你想要一个 TimeSeries），请参考模块
       <code>
        Playback
       </code>
       的文档。
      </p>
     </article>
    </div>
    <!-- Sidebar -->
    <aside class="col-sm-4">
     <div class="sidebar-box">
      <h4>
       目录
      </h4>
      <div class="list-group list-group-root">
       <a class="list-group-item" href="/ligral/quick-start.html">
        快速开始
       </a>
       <a class="list-group-item" href="/ligral/user-guide/index.html">
        用户文档
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/user-guide/terms.html">
         术语定义
        </a>
        <a class="list-group-item" href="/ligral/user-guide/config.html">
         设置语句
        </a>
        <a class="list-group-item active" href="/ligral/user-guide/const.html">
         声明常量
        </a>
        <a class="list-group-item" href="/ligral/user-guide/node.html">
         声明节点
        </a>
        <a class="list-group-item" href="/ligral/user-guide/link.html">
         节点连接
        </a>
        <a class="list-group-item" href="/ligral/user-guide/matrix.html">
         矩阵运算
        </a>
        <a class="list-group-item" href="/ligral/user-guide/route.html">
         路由类型
        </a>
        <a class="list-group-item" href="/ligral/user-guide/signature.html">
         接口签名
        </a>
        <a class="list-group-item" href="/ligral/user-guide/import.html">
         引用依赖
        </a>
       </div>
       <a class="list-group-item" href="/ligral/dev-guide/index.html">
        开发文档
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/dev-guide/syntax.html">
         语法设计
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/interpreter.html">
         解释器
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/component.html">
         模块组件
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/simulation.html">
         问题抽象
        </a>
        <a class="list-group-item" href="/ligral/dev-guide/tools.html">
         工具箱
        </a>
       </div>
       <a class="list-group-item" href="/ligral/interface/index.html">
        接口定义
       </a>
       <div class="list-group">
        <a class="list-group-item" href="/ligral/interface/model.html">
         模块接口
        </a>
        <a class="list-group-item" href="/ligral/interface/protocol.html">
         数据接口
        </a>
       </div>
      </div>
     </div>
     <div class="sidebar-box sidebar-box-bg">
      <h4>
       关于我们
      </h4>
      <p>
       我们是一群有志于突破工业软件封锁、具有开源精神的开发者。本项目旨在替代 Simulink 进行仿真，通过与框图等效的文本语言描述仿真对象，并解释/编译而后求解。
       <a class="readmore" href="https://gitee.com/junruoyu-zheng/ligral/wikis" target="_blank">
        更多 »
       </a>
      </p>
     </div>
     <div class="sidebar-box">
      <h4>
       仓库链接
      </h4>
      <ul>
       <li>
        <a href="https://gitee.com/junruoyu-zheng/ligral" target="_blank" title="Gitee">
         Gitee 仓库
        </a>
       </li>
       <li>
        <a href="https://github.com/JRY-Zheng/ligral" target="_blank" title="GitHub">
         GitHub 仓库
        </a>
       </li>
      </ul>
     </div>
    </aside>
   </div>
  </main>
  <!-- Footer -->
  <footer class="footer">
   <div class="footer-lists">
    <div class="container">
     <div class="row">
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          联系我们
         </h4>
        </li>
        <li>
         <a href="mailto:zhengjry@outlook.com">
          给我们发邮件
         </a>
        </li>
        <li>
         <a href="https://www.zhihu.com/people/LostFish" target="_blank">
          来知乎关注我
         </a>
        </li>
        <li>
         <a href="https://web.okjike.com/u/105ad022-f646-48c0-8236-6007ee5179c5" target="_blank">
          来即刻关注我
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          代码仓库
         </h4>
        </li>
        <li>
         <a href="https://gitee.com/junruoyu-zheng/ligral" target="_blank">
          Gitee 仓库
         </a>
        </li>
        <li>
         <a href="https://github.com/JRY-Zheng/ligral" target="_blank">
          GitHub 仓库
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <ul>
        <li>
         <h4>
          合作伙伴
         </h4>
        </li>
        <li>
         <a href="http://pyminer.com" target="_blank">
          PyMiner 官网
         </a>
        </li>
        <li>
         <a href="https://gitee.com/py2cn/pyminer" target="_blank">
          PyMiner 仓库地址
         </a>
        </li>
       </ul>
      </div>
      <div class="col-sm">
       <h4>
        致谢
       </h4>
       <p>
        Ligral 的开发得到了很多帮助，特在此致谢！感谢我的单位对创新的鼓励；感谢我的导师 James 对数值积分的指导；感谢 Gitee 对项目的支持，在刚开源不久就为我推荐；感谢 PyMiner 开发团队对我的鼓励和支持！
       </p>
       <p class="social-icons">
        <a href="https://gitee.com/junruoyu-zheng/ligral/stargazers" style="text-decoration: none;" target="_blank">
         <img alt="star" src="https://gitee.com/junruoyu-zheng/ligral/badge/star.svg?theme=dark"/>
        </a>
        <a href="https://www.zhihu.com/people/LostFish" target="_blank">
         <i class="fab fa-zhihu fa-2x zhihu-icon">
         </i>
        </a>
       </p>
      </div>
     </div>
    </div>
   </div>
   <div class="footer-bottom">
    <p class="text-center">
     Copyright © 2021. Ligral All rights reserved. 梨果科技版权所有 © 2021
    </p>
    <p class="text-center">
     <a href="#">
      <i class="fa fa-arrow-up">
      </i>
      回到顶部
     </a>
    </p>
   </div>
  </footer>
  <!-- Bootcamp JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="/ligral/js/jquery-3.2.1.slim.min.js">
  </script>
  <script src="/ligral/js/popper.min.js">
  </script>
  <script src="/ligral/js/bootstrap.min.js">
  </script>
  <script src="/ligral/js/TweenMax.min.js">
  </script>
  <script src="/ligral/js/rolling.js">
  </script>
 </body>
</html>